home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / graphic / fgdemo10.zip / MENU.C < prev    next >
Text File  |  1991-10-02  |  15KB  |  545 lines

  1. /**********************************************************************\
  2. *                                                                      *
  3. *  menu.c -- menu management functions                                 *
  4. *                                                                      *
  5. \**********************************************************************/
  6.  
  7. #include "defs.h"
  8.  
  9. CMD main_menu[] =
  10. {
  11.        submenu1, "File",             6,  71, 1, 5,
  12.        submenu2, "Video",           72, 150, 2, 0,
  13.        submenu3, "Fundamentals",   151, 285, 3, 1,
  14.        submenu4, "Display",        286, 377, 4, 2,
  15.        submenu5, "Miscellaneous",  378, 513, 5, 3,
  16.        submenu6, "Utilities",      514, 605, 0, 4
  17. };
  18.  
  19. CMD menu1[] =
  20. {
  21.        about_fg, "About Fastgraph   ", 7, 164, 1, 8,
  22.      about_demo, "About This Demo   ", 7, 164, 2, 0,
  23.      about_tech, "Technical Support ", 7, 164, 3, 1,
  24.      about_docs, "Documentation     ", 7, 164, 4, 2,
  25.      about_site, "Site Licenses     ", 7, 164, 5, 3,
  26.     about_order, "Order By Phone    ", 7, 164, 6, 4,
  27.      print_form, "Print Order Form  ", 7, 164, 7, 5,
  28.           shell, "Shell to DOS      ", 7, 164, 8, 6,
  29.    exit_program, "Exit              ", 7, 164, 0, 7
  30. };
  31.  
  32. CMD menu2[] =
  33. {
  34.     about_modes, "Video Modes   ", 73, 210, 1, 4,
  35.     auto_detect, "Autodetect    ", 73, 210, 2, 0,
  36.  physical_pages, "Physical Pages", 73, 210, 3, 1,
  37.   virtual_pages, "Virtual Pages ", 73, 210, 4, 2,
  38.     coordinates, "Coordinates   ", 73, 210, 0, 3
  39. };
  40.  
  41. CMD menu3[] =
  42. {
  43.       do_points, "Points     ", 152, 284, 1, 7,
  44.        do_lines, "Lines      ", 152, 284, 2, 0,
  45.        do_rects, "Rectangles ", 152, 284, 3, 1,
  46.      do_circles, "Circles    ", 152, 284, 4, 2,
  47.     do_ellipses, "Ellipses   ", 152, 284, 5, 3,
  48.         do_text, "Text       ", 152, 284, 6, 4,
  49.        do_paint, "Region Fill", 152, 284, 7, 5,
  50.         do_clip, "Clipping   ", 152, 284, 0, 6
  51. };
  52.  
  53. CMD menu4[] =
  54. {
  55.      do_bitmaps, "Bitmaps       ", 287, 434, 1, 3,
  56.     do_transfer, "Transfer      ", 287, 434, 2, 0,
  57.       do_scroll, "Scroll        ", 287, 434, 3, 1,
  58.    view_graphic, "Display a File", 287, 434, 0, 2
  59. };
  60.  
  61. CMD menu5[] =
  62. {
  63.        do_mouse, "Mouse    ", 379, 512, 1, 5,
  64.     do_joystick, "Joystick ", 379, 512, 2, 0,
  65.        do_sound, "Sound    ", 379, 512, 3, 1,
  66.        do_music, "Music    ", 379, 512, 4, 2,
  67.       do_editor, "Editor   ", 379, 512, 5, 3,
  68.    do_histogram, "Histogram", 379, 512, 0, 4
  69. };
  70.  
  71. CMD menu6[] =
  72. {
  73.  about_snapshot, "Snapshot ", 515, 604, 1, 2,
  74.      about_clip, "Clip     ", 515, 604, 2, 0,
  75.   about_convert, "Convert  ", 515, 604, 0, 1
  76. };
  77.  
  78. int mouse_limits[] = {0,72,151,286,378,514,640};
  79. int redraw = TRUE;
  80. int selection = 0;
  81.  
  82. /**********************************************************************\
  83. *                                                                      *
  84. *  highlight option -- highlight an option on the main menu            *
  85. *                                                                      *
  86. \**********************************************************************/
  87.  
  88. void highlight_option(n)
  89. {
  90.    int y;
  91.  
  92.    y = menu_top + ptsize + 1;
  93.  
  94.    fg_setcolor(0);
  95.    fg_rect(main_menu[n].x1,main_menu[n].x2,menu_top,menu_bottom-1);
  96.    fg_setcolor(15);
  97.    center_pstring(main_menu[n].menu_item,main_menu[n].x1,main_menu[n].x2,y);
  98. }
  99.  
  100. /**********************************************************************\
  101. *                                                                      *
  102. *  horizontal_menu -- main menu containing submenus                    *
  103. *                                                                      *
  104. \**********************************************************************/
  105.  
  106. horizontal_menu(cmdtab,n,current,foregrnd,backgrnd,hilite_fgnd,hilite_bkgnd)
  107. CMD cmdtab[];
  108. int n, current;
  109. int foregrnd, backgrnd;
  110. int hilite_fgnd, hilite_bkgnd;
  111. {
  112.    register int i, k;
  113.    int c;
  114.    int found, new;
  115.    int ymin, ymax;
  116.    char l;
  117.  
  118.    if (current >= abs(n))
  119.       return(ERR);
  120.  
  121.    ymin = menu_top;
  122.    ymax = ymin + ptsize + 1;
  123.  
  124.    fg_mousevis(OFF);
  125.  
  126.    /* set up list of options */
  127.  
  128.    if (n < 0)
  129.    {
  130.       for (i = 0; i < abs(n); i++)
  131.       {
  132.          fg_setcolor(backgrnd);
  133.          fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
  134.          fg_setcolor(foregrnd);
  135.          center_pstring(cmdtab[i].menu_item,cmdtab[i].x1,cmdtab[i].x2,ymax);
  136.       }
  137.  
  138.       /* if we're just displaying the menu options, return */
  139.  
  140.       return(OK);
  141.    }
  142.  
  143.    /* highlight current option */
  144.  
  145.    i = current;
  146.  
  147.    fg_setcolor(hilite_bkgnd);
  148.    fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
  149.    fg_setcolor(hilite_fgnd);
  150.    center_pstring(cmdtab[i].menu_item,cmdtab[i].x1,cmdtab[i].x2,ymax);
  151.    fg_mousevis(ON);
  152.  
  153.    /* choose an option */
  154.  
  155.    new = current;
  156.    fg_setnum(OFF);
  157.    flushkey();
  158.  
  159.    while (TRUE)
  160.    {
  161.       /* activate the corresponding vertical menu */
  162.  
  163.       c = (*cmdtab[i].menu_func)();
  164.  
  165.       /* cycle through choices */
  166.  
  167.       if (c == LEFT_ARROW || c == BS)
  168.          new = cmdtab[i].prev;
  169.  
  170.       else if (c == RIGHT_ARROW || c == SPACEBAR)
  171.          new = cmdtab[i].next;
  172.  
  173.       else if (c >= 0 && c <= n)
  174.          new = c;
  175.  
  176.       else if (c == ESC)
  177.       {
  178.          exit_program();
  179.          return(i);
  180.       }
  181.  
  182.       else if (isalpha(c))
  183.       {
  184.           c = tolower(c);
  185.           found = FALSE;
  186.           for (k = i+1; k < n; k++)
  187.           {
  188.              l = first_nonblank(cmdtab[k].menu_item);
  189.              if (c == tolower((int)l))
  190.              {
  191.                 found = TRUE;
  192.                 break;
  193.              }
  194.           }
  195.           if (!found)
  196.           {
  197.              for (k = 0; k <= i; k++)
  198.              {
  199.                 l = first_nonblank(cmdtab[k].menu_item);
  200.                 if (c == (char)tolower((int)l))
  201.                 {
  202.                    found = TRUE;
  203.                    break;
  204.                 }
  205.              }
  206.          }
  207.          if (found)
  208.             new = k;
  209.          else
  210.             return(i);
  211.       }
  212.       else
  213.          return(i);
  214.  
  215.       if (i != new)
  216.       {
  217.  
  218.          /* unmark previous option */
  219.  
  220.          fg_mousevis(OFF);
  221.          fg_setcolor(backgrnd);
  222.          fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
  223.          fg_setcolor(foregrnd);
  224.          center_pstring(cmdtab[i].menu_item,cmdtab[i].x1,cmdtab[i].x2,ymax);
  225.  
  226.          /* mark new option */
  227.  
  228.          i = new;
  229.          fg_setcolor(hilite_bkgnd);
  230.          fg_rect(cmdtab[i].x1,cmdtab[i].x2,ymin,ymax);
  231.          fg_setcolor(hilite_fgnd);
  232.          center_pstring(cmdtab[i].menu_item,cmdtab[i].x1,cmdtab[i].x2,ymax);
  233.          fg_mousevis(ON);
  234.       }
  235.    }
  236. }
  237.  
  238. /**********************************************************************\
  239. *                                                                      *
  240. *  submenus                                                            *
  241. *                                                                      *
  242. \**********************************************************************/
  243.  
  244. submenu1()
  245. {
  246.    return(vertical_menu(menu1,0,9,0,15,15,0));
  247. }
  248. submenu2()
  249. {
  250.    return(vertical_menu(menu2,1,5,0,15,15,0));
  251. }
  252. submenu3()
  253. {
  254.    return(vertical_menu(menu3,2,8,0,15,15,0));
  255. }
  256. submenu4()
  257. {
  258.    return(vertical_menu(menu4,3,4,0,15,15,0));
  259. }
  260. submenu5()
  261. {
  262.    return(vertical_menu(menu5,4,6,0,15,15,0));
  263. }
  264. submenu6()
  265. {
  266.    return(vertical_menu(menu6,5,3,0,15,15,0));
  267. }
  268.  
  269. /**********************************************************************\
  270. *                                                                      *
  271. *  vertical_menu -- submenu off main menu                              *
  272. *                                                                      *
  273. \**********************************************************************/
  274.  
  275. vertical_menu(cmdtab,index,n,foregrnd,backgrnd,hilite_fgnd,hilite_bkgnd)
  276. CMD cmdtab[];
  277. int index;
  278. int n;
  279. int foregrnd, backgrnd;
  280. int hilite_fgnd, hilite_bkgnd;
  281. {
  282.    register int i, j, k;
  283.    int found, new;
  284.    int height;
  285.    int left, right;
  286.    int string_x;
  287.    int x1, x2, y1, y2;
  288.    int ymin, ymax;
  289.    in